import shlex
import colorama
import pickle
import os
# 导入所有command_method模块中的命令类
from command_method import *
import json
import command_method
import utils as utils

def main():
    # 绿色欢迎banner
    print(colorama.Fore.GREEN + "welcome to use VM, use -h to see help" + colorama.Style.RESET_ALL)

    # 初始化命令列表
    commands = {
        
    }

    # 打开config.json文件,读取配置
    config_context = json.load(open("config.json", "r"))

    # 将要处理的日期放入config_context中，

    # 尝试打开pickle储存文件./data/vm.pickle,不存在则创建
    try:
        with open(config_context.get("data_path"), "rb") as f:
            saved_data = pickle.load(f)
            print("读取数据成功")
    except FileNotFoundError:
        print("未找到数据文件，创建新文件")
        with open(config_context.get("data_path"), "wb") as f:
            saved_data = {}
            pickle.dump(saved_data, f)
    
    # 检查storage_path是否存在于文件系统中，如果不存在则报错退出
    storage_path = config_context.get("storage_path")
    if not os.path.exists(storage_path):
        print(f"storage_path不存在: {storage_path}")
        return
    
    # 主循环
    while True:
        try:
            # 提示用户输入命令,并去除首尾空格读入
            user_input = input("\nDRP >>: ").strip()
            if not user_input:
                continue

            # 解析输入
            try:
                parts = shlex.split(user_input, posix=False)
                print(f"raw input: {parts}")  # 打印解析后的参数列表
            except ValueError as e:
                print(f"参数解析错误: {str(e)}")
                continue

            # 优先检查特殊命令
            if parts[0] in ("exit", "quit", "q"):
                # 退出程序
                print("程序退出")
                break

            # 检查命令是否存在
            command = commands.get(parts[0])
            if command is None:
                print(f"未知命令: {parts[0]}")
                continue

            # 获取命令参数
            args = command.get_arguments(parts[1:])
            print(f"解析后的参数: {args}")  # 打印解析后的参数字典
            # 将config_context合并到args中，优先级为args>config_context
            args.update(config_context)
            # 执行命令
            ret = command.execute(args)

        except KeyboardInterrupt:
            print("\n程序退出")
            break
        except EOFError:
            print("\n程序退出")
            break
        # except Exception as e:
        #     print(f"发生错误: {str(e)}")
        #     continue

    pickle.dump(saved_data, open("data/vm.pkl", "wb"))
    print("数据已保存")


def pre_process():
    """
    1、预处理模块，检查文件环境是否正确；
    2、返回配置信息config_context及命令列表commands
    """

    # 载入config.json文件
    try:
        with open("config.json", "r") as f:
            config_context = json.load(f)
    except FileNotFoundError:
        print("请正确配置config.json文件，程序退出")
        return None, None
    
    # 检查file_home是否存在于文件系统中，如果不存在则报错退出
    file_home = config_context.get("file_home")
    if not os.path.exists(file_home):
        print(f"file_home不存在: {file_home}")
        return None, None
    
    # 拼接file_home和storage_path，检查storage_path是否存在于文件系统中，如果不存在则创建
    storage_path = os.path.join(file_home, config_context.get("storage_path"))
    if not os.path.exists(storage_path):
        os.makedirs(storage_path)
        print(f"storage_path: {storage_path}不存在，已创建")

    saved_data_path = os.path.join(file_home, config_context.get("saved_data_path"))
    # 尝试打开pickle储存文件./data/vm.pickle,不存在则创建
    try:
        with open(saved_data_path, "rb") as f:
            saved_data = pickle.load(f)
            print("读取数据成功")
    except FileNotFoundError:
        print("未找到数据文件，创建新文件")
        with open(saved_data_path, "wb") as f:
            saved_data = {}
            pickle.dump(saved_data, f)

    # 将saved_data放入config_context中
    config_context["saved_data"] = saved_data

    # 初始化命令列表
    commands = {}
    for name in command_method.__all__:
        # 获取命令类
        command_class = getattr(command_method, name)
        # 实例化命令类
        command_instance = command_class()
        # 将命令类添加到命令列表中
        commands[command_instance.get_name()] = command_instance


if __name__ == "__main__":
    # 初始化colorama
    colorama.init(autoreset=True)
    
    # 调用主函数
    main()
    
    # 清理colorama资源
    colorama.deinit()
